/**
 * @Author Fizz Pu
 * @Date 2020/11/18 下午11:12
 * @Version 1.0
 * 失之毫厘，缪之千里！
 */

/**
 * 请实现一个函数，用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样，那么它是对称的。
 *
 * 例如，二叉树 [1,2,2,3,4,4,3] 是对称的。
 *
 *     1
 *    / \
 *   2   2
 *  / \ / \
 * 3  4 4  3
 * 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
 *
 *     1
 *    / \
 *   2   2
 *    \   \
 *    3    3
 *
 *  
 *
 * 示例 1：
 *
 * 输入：root = [1,2,2,3,4,4,3]
 * 输出：true
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

// 思路

// 弟弟, 你要学会转换思路啊
//       1
// *    / \
// *   2   2
// *  / \ / \
// * 3  4 4  3
//       2     2
//      / \   / \
///     3  4  4  3
// 2的子树 是否互为镜像
// 左边== 右边

/**
 * 有了前面的铺垫
 * helper(node1, node2)
 *      if(node1 == null && node2 == null) return true
 *      if(node1 != null && node2 == null) return false
 *      if(node1 == null && node2 != null) return false
 *      if(node1.val != node2.val) return false;
 *      helper(node1.left, node2.right) && helper(node1.right, node2.left)
  */

public class LeeOffer28 {
    public boolean isSymmetric(TreeNode root) {
        if (root == null) return true;
        return helper(root.left, root.right);
    }

    private boolean helper(TreeNode node1, TreeNode node2) {
        if (node1 == null && node2 == null) return true;
        if (node1 != null && node2 == null) return false;
        if (node1 == null && node2 != null) return false;
        if (node1.val != node2.val) return false;
        return helper(node1.left, node2.right) && helper(node1.right, node2.left);
    }
}
